競プロ典型 90 問 013
種別: 記事
カテゴリ: 競技プログラミング
サブカテゴリ: AtCoder > 競プロ典型 90 問
タグ: #解いた問題
(工事中)
AtCoder で公開されている競プロ典型 90 問 の013 を解いた
解き方
解答例
下は上記の方法で解いたときの提出結果である。また、その提出の際に提出したソースコードをその下に転記する。
code: C
#include <stdio.h>
#define INF 1000000001
typedef struct list {
int op;
int cost;
struct list *next;
} list;
list pool200000 = {};
int used = 0;
void down_heap (int i, int num_elem, int *pri_queue, int *val, int* map) {
int ch2 = { INF, INF };
if (num_elem <= 2*i+1) {
return;
}
ch0 = val[pri_queue2*i+1];
if (num_elem > 2*i+2) {
ch1 = val[pri_queue2*i+2];
}
if (ch0 < ch1 && ch0 < val[pri_queuei]) {
int tmp = pri_queuei;
pri_queuei = pri_queue2*i+1;
pri_queue2*i+1 = tmp;
map[pri_queuei] = i;
map[pri_queue2*i+1] = 2*i+1;
down_heap (2*i+1, num_elem, pri_queue, val, map);
} else if (ch1 < val[pri_queuei]) {
int tmp = pri_queuei;
pri_queuei = pri_queue2*i+2;
pri_queue2*i+2 = tmp;
map[pri_queuei] = i;
map[pri_queue2*i+2] = 2*i+2;
down_heap (2*i+2, num_elem, pri_queue, val, map);
}
return;
}
void up_heap (int i, int *pri_queue, int *val, int *map) {
int parent = (i - 1) / 2;
if (i == 0) {
return;
}
if (val[pri_queuei] < val[pri_queueparent]) {
int tmp = pri_queuei;
pri_queuei = pri_queueparent;
pri_queueparent = tmp;
map[pri_queuei] = i;
map[pri_queueparent] = parent;
up_heap (parent, pri_queue, val, map);
}
return;
}
int dequeue(int *num_elem, int *pri_queue, int *val, int* map) {
int ans = pri_queue0;
*num_elem -= 1;
pri_queue0 = pri_queue*num_elem;
map[pri_queue0] = 0;
down_heap(0, *num_elem, pri_queue, val, map);
return ans;
}
void dijkstra(int *num_elem, int *pri_queue, int *d, int* map, list **e) {
while (*num_elem > 0) {
int v = dequeue(num_elem, pri_queue, d, map);
list *l = ev;
while (l != NULL) {
int tmp_d = dv + l->cost;
if (tmp_d < dl->op-1) {
dl->op-1 = tmp_d;
up_heap(mapl->op-1, pri_queue, d, map);
}
l = l->next;
}
}
return;
}
int main () {
int n = 0;
int m = 0;
int res = 0;
list *e100000 = {};
int d1100000 = {};
int dn100000 = {};
int pri_queue100000 = {};
int num_elem = 0;
int map100000 = {};
res = scanf("%d", &n);
res = scanf("%d", &m);
for (int i = 0; i < m; i++) {
int a = 0;
int b = 0;
int c = 0;
res = scanf("%d", &a);
res = scanf("%d", &b);
res = scanf("%d", &c);
poolused.op = b;
poolused.cost = c;
poolused.next = ea-1;
ea-1 = pool+used;
used++;
poolused.op = a;
poolused.cost = c;
poolused.next = eb-1;
eb-1 = pool+used;
used++;
}
for (int i = 0; i < n; i++) {
d1i = INF;
dni = INF;
pri_queuenum_elem = i;
mapi = num_elem;
num_elem++;
}
d10 = 0;
dnn-1 = 0;
dijkstra(&num_elem, pri_queue, d1, map, e);
pri_queue0 = n-1;
mapn-1 = 0;
num_elem = 1;
for (int i = 0; i < n - 1; i++) {
pri_queuenum_elem = i;
mapi = num_elem;
num_elem++;
}
dijkstra(&num_elem, pri_queue, dn, map, e);
for (int i = 0; i < n; i++) {
printf("%d\n", d1i+dni);
}
return 0;
}
私の提出一覧
table: submissions_atcoder_typical90_013
提出のURL 提出時刻 結果 備考
1回目 https://atcoder.jp/contests/typical90/submissions/22351499 2021-05-06T21:56:17+0900 WA
2回目 https://atcoder.jp/contests/typical90/submissions/22351613 2021-05-06T22:01:38+0900 WA
3回目 https://atcoder.jp/contests/typical90/submissions/22352823 2021-05-06T22:49:51+0900 WA
4回目 https://atcoder.jp/contests/typical90/submissions/22353148 2021-05-06T23:01:59+0900 WA
5回目 https://atcoder.jp/contests/typical90/submissions/22353577 2021-05-06T23:18:06+0900 WA
6回目 https://atcoder.jp/contests/typical90/submissions/22353622 2021-05-06T23:20:41+0900 WA
7回目 https://atcoder.jp/contests/typical90/submissions/22353786 2021-05-06T23:27:04+0900 WA
8回目 https://atcoder.jp/contests/typical90/submissions/22353984 2021-05-06T23:35:39+0900 WA
9回目 https://atcoder.jp/contests/typical90/submissions/22354053 2021-05-06T23:38:28+0900 WA
10回目 https://atcoder.jp/contests/typical90/submissions/22354252 2021-05-06T23:46:30+0900 WA
11回目 https://atcoder.jp/contests/typical90/submissions/22354281 2021-05-06T23:47:32+0900 WA
12回目 https://atcoder.jp/contests/typical90/submissions/22355346 2021-05-07T00:36:02+0900 WA
13回目 https://atcoder.jp/contests/typical90/submissions/22369793 2021-05-07T20:42:15+0900 TLE
14回目 https://atcoder.jp/contests/typical90/submissions/22369943 2021-05-07T20:48:04+0900 TLE
15回目 https://atcoder.jp/contests/typical90/submissions/22370065 2021-05-07T20:53:15+0900 WA
16回目 https://atcoder.jp/contests/typical90/submissions/22370108 2021-05-07T20:55:16+0900 WA
17回目 https://atcoder.jp/contests/typical90/submissions/22370137 2021-05-07T20:56:36+0900 TLE
18回目 https://atcoder.jp/contests/typical90/submissions/22370637 2021-05-07T21:17:35+0900 TLE
19回目 https://atcoder.jp/contests/typical90/submissions/22370742 2021-05-07T21:22:06+0900 TLE
20回目 https://atcoder.jp/contests/typical90/submissions/22370905 2021-05-07T21:28:47+0900 WA
21回目 https://atcoder.jp/contests/typical90/submissions/22377927 2021-05-08T09:10:08+0900 TLE
22回目 https://atcoder.jp/contests/typical90/submissions/22378051 2021-05-08T09:24:28+0900 TLE
23回目 https://atcoder.jp/contests/typical90/submissions/22378226 2021-05-08T09:41:11+0900 WA
24回目 https://atcoder.jp/contests/typical90/submissions/22378246 2021-05-08T09:43:21+0900 TLE
25回目 https://atcoder.jp/contests/typical90/submissions/22379252 2021-05-08T11:14:49+0900 TLE
26回目 https://atcoder.jp/contests/typical90/submissions/22379616 2021-05-08T11:38:58+0900 WA
27回目 https://atcoder.jp/contests/typical90/submissions/22379836 2021-05-08T11:51:24+0900 WA
28回目 https://atcoder.jp/contests/typical90/submissions/22379927 2021-05-08T11:57:39+0900 WA
29回目 https://atcoder.jp/contests/typical90/submissions/22379962 2021-05-08T12:00:14+0900 AC
感想
ローカルにおいてあったzakkan.txt(雑感)には、まだ書かれていないので、こっちに直接書く
この問題も提出回数が多いな…
ダイクストラ法自体は大学の演習で書いたことあるし、動作もそこまで複雑じゃないからイメージしやすいんやけど、そのときは$ V^{2} のオーダーの計算量で許されていたから、優先度付きキューを使う
ダイクストラ法自体は大学の演習で書いたことあるし、動作もそこまで複雑じゃないからイメージしやすいんやけど、そのときは$ V^{2} のオーダーの計算量で許されていたから、優先度付きキューは使っていなかった
いざ優先度付きキューを使って実装してみたら、距離が更新されたときにキューにすでにいれた値をどうすればよいかが悩ましかった。
いまでこそ、すでに入れたのはそのままおいておいて、改めて入れても問題ないことを知ったからそうしているけれど、当時はそんな発想はなかったため、キューに入れた値を書き換えることをしていた。
そもそも$ E の個数は$ O(V^{2}) なので、疎なグラフという前提がなければ$ V^{2} より速くすることを求められることもないし
そんなこんなで、キュー周りの実装がややこしくなったので、それで間違いを作ってしまったのかなと思ったが、提出を追ってみても原因が何だったのか思い出せなかった。
ただ、いったん止めて次の日から(13回目以降)は、いろいろ提出してみて、どこが悪いか探そうとしている感じやね。だから提出回数も増えていったのかな。
基本的に私は入力例でテストするから、それは合っているのにACにならない場合はどの例をテストすべきかもわからず、たまにこうやってハマることもあるんやおね